home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 23
/
AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso
/
Updates
/
Datatypes
/
PCD-DT35
/
Source
/
dispatcher.c
next >
Wrap
C/C++ Source or Header
|
1999-11-14
|
5KB
|
247 lines
#include <clib/alib_protos.h>
#include <pragma/datatypes_lib.h>
#include <pragma/dos_lib.h>
#include <pragma/exec_lib.h>
#include <pragma/intuition_lib.h>
#include <pragma/graphics_lib.h>
#include <pragma/utility_lib.h>
#include <datatypes/pictureclass.h>
#include <dos/dostags.h>
#include <exec/memory.h>
#include <intuition/icclass.h>
#include <stdio.h>
#include <string.h>
struct Arg1
{
long *res;
};
struct Arg2
{
long res;
};
static void ReadPrefs(Arg2 *arg)
{
char *var;
arg->res=2;
if(var=(char *)AllocVec(256,0))
{
if(GetVar("ENV:DataTypes/pcd.prefs",var,256,LV_VAR|GVF_GLOBAL_ONLY)>=0)
{
RDArgs *rdargs;
if(rdargs=(RDArgs *)AllocDosObject(DOS_RDARGS,0))
{
RDArgs *args;
Arg1 para={0};
rdargs->RDA_Source.CS_Buffer=var;
rdargs->RDA_Source.CS_Length=strlen(var);
rdargs->RDA_Source.CS_CurChr=0;
if(args=ReadArgs("RESOLUTION/A/N",(long *)¶,rdargs))
{
if(para.res)
{
arg->res=*para.res;
if(arg->res<0) arg->res=0;
else if(arg->res>5) arg->res=5;
}
FreeArgs(args);
}
FreeDosObject(DOS_RDARGS,rdargs);
}
}
FreeVec(var);
}
}
ULONG Colors2DT(Object *obj,UBYTE *color)
{
UBYTE *cr;
ULONG *cregs,i,num,error=0;
GetDTAttrs(obj,PDTA_NumColors,&num,PDTA_ColorRegisters,&cr,PDTA_CRegs,&cregs,TAG_END);
if(cr&&cregs)
{
for(i=0;i<num;i++,cr+=3,cregs+=3,color+=4)
{
cr[0]=color[1];
cr[1]=color[2];
cr[2]=color[3];
cregs[0]=cr[0]<<24;
cregs[1]=cr[1]<<24;
cregs[2]=cr[2]<<24;
}
}
else error=ERROR_NO_FREE_STORE;
return error;
}
static ULONG ReadP6_V43(Object *obj,BitMapHeader *bh,BPTR file)
{
ULONG error=0,len=bh->bmh_Width*bh->bmh_Height*3;
UBYTE *pix;
if(pix=(UBYTE *)AllocVec(len,0))
{
if(Read(file,pix,len)==len) DoMethod(obj,PDTM_WRITEPIXELARRAY,pix,PBPAFMT_RGB,bh->bmh_Width*3,0,0,bh->bmh_Width,bh->bmh_Height);
else error=DTERROR_NOT_ENOUGH_DATA;
FreeVec(pix);
}
else if(pix=(UBYTE *)AllocVec(bh->bmh_Width*3,0))
{
UWORD y;
for(y=0;y<bh->bmh_Height;y++)
{
if(Read(file,pix,bh->bmh_Width*3)!=bh->bmh_Width*3)
{
error=DTERROR_NOT_ENOUGH_DATA;
break;
}
DoMethod(obj,PDTM_WRITEPIXELARRAY,pix,PBPAFMT_RGB,bh->bmh_Width*3,0,y,bh->bmh_Width,1);
}
FreeVec(pix);
}
else error=ERROR_NO_FREE_STORE;
return error;
}
static ULONG ReadNum(BPTR file)
{
ULONG retval=0;
for(;;)
{
char c;
if(Read(file,&c,1)!=1) return 0;
if(c==10||c==32) break;
retval*=10;
retval+=c-'0';
}
return retval;
}
static ULONG GetPicture(IClass *cl,Object *obj)
{
ULONG error=0;
BPTR nil;
if(nil=Open("NIL:",MODE_OLDFILE))
{
char *fname,*dname,tmp[L_tmpnam];
Arg2 arg;
ReadPrefs(&arg);
GetDTAttrs(obj,DTA_Name,&dname,TAG_END);
if(dname)
{
SetDTAttrs(obj,0,0,DTA_ObjName,dname,TAG_END);
tmpnam(tmp);
strncpy(tmp,"PIPE:",5);
if(fname=(char *)AllocVec(strlen(dname)+L_tmpnam+50,0))
{
SPrintf(fname,"run pcdtoppm >%s -%lu -ppm \"%s%\"",tmp,arg.res+1,dname);
if(Execute(fname,nil,nil)!=DOSFALSE)
{
BPTR file;
if(file=Open(tmp,MODE_OLDFILE))
{
BitMapHeader *bh;
char head[3];
GetDTAttrs(obj,PDTA_BitMapHeader,&bh,TAG_END);
if(bh)
{
if(Read(file,head,3)==3)
{
bh->bmh_Width=ReadNum(file);
bh->bmh_PageWidth=bh->bmh_Width;
bh->bmh_Height=ReadNum(file);
bh->bmh_PageHeight=bh->bmh_Height;
bh->bmh_Compression=1;
ReadNum(file);
bh->bmh_Depth=24;
SetDTAttrs(obj,0,0,DTA_ErrorNumber,&error,DTA_NominalHoriz,bh->bmh_Width,DTA_NominalVert,bh->bmh_Height,PDTA_ModeID,0,PDTA_SourceMode,PMODE_V43,TAG_END);
if(!error) error=ReadP6_V43(obj,bh,file);
}
else error=DTERROR_NOT_ENOUGH_DATA;
}
else error=ERROR_NO_FREE_STORE;
Close(file);
}
else error=IoErr();
}
else error=IoErr();
FreeVec(fname);
}
else error=ERROR_NO_FREE_STORE;
}
else error=ERROR_NO_FREE_STORE;
Close(nil);
}
else error=IoErr();
return error;
}
static ULONG mNew(IClass *cl,Object *obj,opSet *msg)
{
TagItem *ti;
if(ti=FindTagItem(DTA_SourceType,msg->ops_AttrList))
{
if(ti->ti_Data!=DTST_FILE&&ti->ti_Data!=DTST_CLIPBOARD&&ti->ti_Data!=DTST_RAM)
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
return 0;
}
}
if(obj==(Object *)cl)
{
if(obj=(Object *)DoSuperMethodA(cl,obj,Msg(msg)))
{
ULONG error;
if(error=GetPicture(cl,obj))
{
SetIoErr(error);
CoerceMethod(cl,obj,OM_DISPOSE);
obj=0;
}
}
}
else
{
SetIoErr(ERROR_NOT_IMPLEMENTED);
obj=0;
}
return ULONG(obj);
}
static ULONG mSet(IClass *cl,Object *obj,opSet *msg)
{
ULONG retval;
if(retval=DoSuperMethodA(cl,obj,Msg(msg)))
{
RastPort *rp;
if(rp=ObtainGIRPort(msg->ops_GInfo))
{
DoMethod(obj,GM_RENDER,msg->ops_GInfo,rp,GREDRAW_UPDATE);
ReleaseGIRPort(rp);
retval=0;
}
}
return retval;
}
extern "C" ULONG Dispatcher(IClass *cl,Object *obj,Msg msg)
{
ULONG retval;
switch(msg->MethodID)
{
case OM_NEW:
retval=mNew(cl,obj,(opSet *)msg);
break;
case OM_UPDATE:
if(DoMethod(obj,ICM_CHECKLOOP)) break;
case OM_SET:
retval=mSet(cl,obj,(opSet *)msg);
break;
default:
retval=DoSuperMethodA(cl,obj,msg);
}
return retval;
}